home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / 2KTETRIS.ZIP / SCREEN.ASM < prev    next >
Assembly Source File  |  1992-09-02  |  6KB  |  361 lines

  1. .MODEL TINY
  2.  
  3.     public    Print
  4.     public    TestSpace
  5.     public    Bottom
  6.     public    InitScreen
  7.     public    PrintLong
  8.     public    GameOverPrompt
  9.     public    RemovePause
  10.     public    PrintPause
  11.     extrn    RandSeed:word
  12.     extrn    Items:word
  13.  
  14. BORDER_CHAR            equ        32
  15. BORDER_COLOR        equ     29
  16.  
  17. HISCORE_TEXT_POS    equ        0
  18. SCORE_TEXT_POS        equ        240
  19. LEVEL_TEXT_POS        equ        400
  20. LOGO_POS            equ        800
  21. BY_POS                equ     970
  22. TORE_POS            equ     1128
  23. BAST_POS            equ        1202
  24. PREVIEW_TEXT_POS    equ        134
  25. GAME_OVER_POS        equ        934
  26. PLAY_AGAIN_POS        equ     1654
  27. PAUSE_POS            equ     934
  28.  
  29. .DATA
  30. TetrisLogo    label word
  31.     db    'S',1
  32.     db    'm',2
  33.     db    'a',3
  34.     db    'l',4
  35.     db    'l',5
  36.     db    'T',6
  37.     db    'e',7
  38.     db    't',8
  39.     db    'r',9
  40.     db    'i',10
  41.     db    's',11
  42.     dw    0
  43.  
  44.     db    'b',7
  45.     db    'y',7
  46.     dw    0
  47.  
  48.     db    'T',1
  49.     db    'o',2
  50.     db    'r',3
  51.     db    'e',4
  52.     dw    0
  53.     db    'B',6
  54.     db    'a',7
  55.     db    's',8
  56.     db    't',9
  57.     db    'i',10
  58.     db    'a',11
  59.     db    'n',12
  60.     db    's',13
  61.     db    'e',14
  62.     db    'n',15
  63.     dw    0
  64.  
  65.     db    'HISCORE:',0
  66.     db    'SCORE:',0
  67.     db    'LEVEL:',0
  68.     db    'Preview:',0
  69.  
  70. GameOverText label word
  71.     db    'GAME OVER',0
  72.     db     'Play again?',0
  73. RemovePauseText label byte
  74.     db    5 dup (' ')
  75.     db    0
  76. PauseText db    'PAUSE',0
  77.  
  78. RowFill        db    25 dup (?)
  79.  
  80.  
  81. .CODE
  82. InitScreen    proc    near
  83.     mov    ax,0001h                        ; Screen mode 1
  84.     int     10h
  85.  
  86.     xor     di,di
  87.     mov        ax,0b800h
  88.     mov        es,ax
  89.     mov        cx,1000
  90.     xor        ax,ax
  91.     rep        stosw                                ; Fill screen with 0
  92.  
  93.     mov        ax,BORDER_CHAR+256*BORDER_COLOR        ; Horisontal lines
  94.     mov        di,28
  95.     mov     cx,12
  96.     rep    stosw                                   ; Upper
  97.     mov        di,28+24*80
  98.     mov        cx,12
  99.     rep stosw                                   ; Lower
  100.  
  101.     mov     cx,23
  102.     mov        ax,BORDER_CHAR+256*BORDER_COLOR     ; Vertical lines
  103.     mov        di,80+28
  104. loop_s1:
  105.     mov        es:[di],ax
  106.     add        di,22
  107.     mov        es:[di],ax
  108.     add        di,58
  109.     loop    loop_s1
  110.  
  111.  
  112.     push        es
  113.     push        ds
  114.     pop        es
  115.     mov        cx,25
  116.     mov        di, offset RowFill
  117.     mov        ax,0
  118.     rep stosb                                    ; Clear buffer
  119.     pop        es
  120.  
  121. ;    Print text
  122.     mov        di,LOGO_POS
  123.     mov        si,offset TetrisLogo
  124.     call    PrintColorString
  125.     mov        di,BY_POS
  126.     call    PrintColorString
  127.     mov        di,TORE_POS
  128.     call    PrintColorString
  129.     mov        di,BAST_POS
  130.     call    PrintColorString
  131.     mov        ah,1
  132.     mov        di,HISCORE_TEXT_POS
  133.     call    PrintMonoString
  134.     mov        di,SCORE_TEXT_POS
  135.     call    PrintMonoString
  136.     mov        di,LEVEL_TEXT_POS
  137.     call    PrintMonoString
  138.     mov        di,PREVIEW_TEXT_POS
  139.     call    PrintMonoString
  140.     ret
  141.  
  142. InitScreen    endp
  143.  
  144. DeleteRow    proc    near                ;bx=Row
  145.  
  146.     mov        dx,0b800h
  147.     mov        es,dx
  148.  
  149.     dec        bx
  150.     mov        cx,bx
  151.     mov        ax,bx
  152.  
  153.     mov        dx,80
  154.     imul    dx
  155.     add        ax,30                                   ; ax=source offset
  156.  
  157.     mov        si,ax
  158. loop_d1:
  159.     mov        di,si
  160.     add        di,80
  161.     push     cx
  162.     mov     cx,10
  163.     push    ds
  164.     push    es
  165.     pop        ds
  166.     rep    movsw
  167.     pop     ds
  168.     sub        si,100
  169.  
  170.     mov     cl,byte ptr RowFill[bx]
  171.     mov        byte ptr RowFill[bx+1],cl
  172.     dec        bx
  173.  
  174.     pop        cx
  175.     loop       loop_d1
  176.  
  177.     ret
  178. DeleteRow    endp
  179.  
  180. Bottom    proc    near          ;ax=ItemNr            di=scroffset
  181.     mov        dx,0b800h
  182.     mov        es,dx
  183.     mov     dx,06
  184.  
  185.     imul    dx
  186.     add     ax, offset Items                 ; ax=ax*6
  187.  
  188.     xor     cx,cx                           ; for cx=0 to 3
  189. loop_b1:
  190.     mov     bx,ax
  191.     add     bx,cx
  192.     push    ax
  193.     mov     al,byte ptr [bx+2]
  194.     cbw
  195.     shl        ax,1
  196.     add     di,ax
  197.     mov        ax,di
  198.     xor        dx,dx
  199.     mov        bx,80
  200.     div        bx
  201.     mov        bx,ax
  202.     inc        byte ptr RowFill[bx]
  203.     pop        ax
  204.     inc     cx
  205.     cmp        cx,4
  206.     jne        loop_b1
  207.  
  208.     xor        bx,bx
  209. loop_b2:
  210.     cmp        byte ptr RowFill[bx],10
  211.     jne        not_full
  212.     push    bx
  213.     call    DeleteRow
  214.     inc        word ptr randseed
  215.     pop        bx
  216. not_full:
  217.     inc     bx
  218.     cmp        bx,24
  219.     jne        loop_b2
  220.  
  221.     ret
  222. Bottom    endp
  223.  
  224. TestSpace    proc    near        ;ax= item_nr    di=scroffs
  225.     mov        dx,0b800h
  226.     mov        es,dx
  227.     mov     dx,06
  228.     imul    dx
  229.     add     ax, offset Items                 ; ax=ax*6
  230.  
  231.     xor     dx,dx                           ; for dx=0 to 3
  232. loop1:
  233.     mov     bx,ax
  234.     add     bx,dx
  235.     push    ax
  236.     mov     al,byte ptr [bx+2]
  237.     cbw
  238.     shl        ax,1
  239.     add     di,ax
  240.     pop        ax
  241.     cmp     word ptr es:[di],0
  242.     jne         bad
  243.     inc     dx
  244.     cmp        dx,4
  245.     jne        loop1
  246.     mov        ax,01
  247.     ret
  248. bad:
  249.     xor        ax,ax
  250.     ret
  251. TestSpace    endp
  252.  
  253. Print    proc    near                    ;ax= item_nr    di=scroffs si=T/F
  254.     mov        dx,0b800h
  255.     mov        es,dx
  256.     mov     dx,06
  257.     imul    dx                          ; ax=ax*6
  258.     add     ax, offset Items              ; ax+=[_items]
  259.  
  260.     xor        dx,dx                           ; for dx=3 to 0
  261.  
  262.     cmp        si,0
  263.     je         loop2
  264.     mov     bx,ax
  265.     mov        si,ds:[bx]
  266. loop2:
  267.     mov     bx,ax
  268.     add     bx,dx
  269.     push    ax
  270.     mov     al,byte ptr [bx+2]
  271.     cbw
  272.     shl        ax,1
  273.     add        di,ax
  274.     pop        ax
  275.     mov     es:[di],si
  276.     inc     dx
  277.     cmp        dx,4
  278.     jne        loop2
  279.     ret
  280. Print    endp
  281.  
  282. PrintLong    proc near
  283.  
  284.     mov        bx,0b800h
  285.     mov        es,bx
  286.  
  287.     mov        bx,10
  288. more_digits:
  289.     div        bx
  290.     add        dx,'0'+256*7
  291.     mov        es:[di],dx
  292.     sub        di,2
  293.     mov        dx,0
  294.     cmp        ax,0
  295.     jne        short more_digits
  296.     ret
  297. PrintLong    endp
  298.  
  299. PrintColorString    proc near
  300.     mov        bx,0b800h
  301.     mov        es,bx
  302. color_loop:
  303.     mov        ax,ds:si
  304.     inc        si
  305.     inc        si
  306.     and        ax,ax
  307.     jz        color_done
  308.     mov        es:di,ax
  309.     inc        di
  310.     inc        di
  311.     jmp        color_loop
  312. color_done:
  313.     ret
  314. PrintColorString     endp
  315.  
  316. PrintMonoString        proc near
  317.     mov        bx,0b800h
  318.     mov        es,bx
  319. mono_loop:
  320.     mov        al,ds:si
  321.     inc        si
  322.     and        al,al
  323.     jz        mono_done
  324.     mov        es:di,ax
  325.     inc        di
  326.     inc        di
  327.     jmp        mono_loop
  328. mono_done:
  329.     ret
  330. PrintMonoString        endp
  331.  
  332.  
  333. GameOverPrompt        proc near
  334.     mov        ah,1
  335.     mov        di,GAME_OVER_POS
  336.     mov        si,offset GameOverText
  337.     call    near ptr PrintMonoString
  338.     mov        di,PLAY_AGAIN_POS
  339.     call    near ptr PrintMonoString
  340.     ret
  341. GameOverPrompt        endp
  342.  
  343. RemovePause proc near
  344.     xor        ah,ah
  345.     mov        di,PAUSE_POS
  346.     mov        si,offset RemovePauseText
  347.     call    PrintMonoString
  348.     ret
  349. RemovePause endp
  350.  
  351. PrintPause proc near
  352.     mov        ah,1
  353.     mov        di,PAUSE_POS
  354.     mov        si,offset PauseText
  355.     call    PrintMonoString
  356.     ret
  357. PrintPause endp
  358.  
  359.  
  360. end
  361.